/*
Date:20210524 9:54PM
key:把操作存贮为x，y各加一个值，并且观察出方向是随顺时针变化的
*/
class Solution {
public:
    //通过字典存储向x方向前进一个单位的数据,方向是顺时针变化
    const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        
        const int n=matrix.size();
        const int m=matrix[0].size();
        int x=0;
        int y=0;
        int d=0;
        vector<int>v;
        //cout<<dir[d][0]<<" "<<dir[d][1]<<endl;
        //首先遍历的次数是确定的
        for(int i=0;i<m*n;i++)
        {
            v.push_back(matrix[x][y]);
            matrix[x][y]=INT_MIN;
            int tmp_x=x+dir[d][0];
            int tmp_y=y+dir[d][1];
            //边界或者已访问元素都要调整前进方向
            if(tmp_x>-1&&tmp_y>-1&&tmp_x<n&&tmp_y<m&&(matrix[tmp_x][tmp_y]!=INT_MIN))
            {
                x=tmp_x;
                y=tmp_y;
            }
            else
            {
                //按顺时针变化到下一个方向
                d=(d+1)%4;
                x=x+dir[d][0];
                y=y+dir[d][1];
            }
        }
        
        return v;
    }
};